package com.jm.service.impl;

import com.jm.service.CommonService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * 上传与文件
 */
@Service
public class CommonServiceImpl implements CommonService {

    @Value("${toy.path}")
    private String filePath;

    @Value("${toy.uploadingpath}")
    private String upLoadingPath;


    /**
     * 生成该文件的文件夹并随机生成转存该文件
     *
     * @param file 传入文件对象
     * @return 随机生成的文件名字
     * @throws IOException
     */
    @Override
    public String getFileName(MultipartFile file) throws IOException {

//        定义最终文件的名字
        String fileName;

//        得到文件名
        String originalFilename = file.getOriginalFilename();
//        获取文件后缀 如 .jpg 等
        String fileTail = originalFilename.substring(originalFilename.lastIndexOf("."));
//        生成UUID
        String uuids = UUID.randomUUID().toString();
//
        fileName = uuids + fileTail;

//       创建一个目录对象
        File dir = new File(filePath);
        if (!dir.exists()) {
//            创建目录
            dir.mkdirs();
        }
//        执行转存操作
        file.transferTo(new File(filePath + fileName));
        System.out.println("转存成功");
        return fileName;
    }

    /**
     * 传入需要上传的文件名字
     *
     * @param name        文件名字
     * @param response
     * @param contextType 文件类型
     * @throws IOException
     */
    @Override
    public void downLoadFile(String name, HttpServletResponse response, String contextType) throws IOException {
//        通过输入流读取指定文件
        FileInputStream fis = new FileInputStream(new File(filePath + name));
//        通过输出流写入浏览器
        ServletOutputStream outputStream = response.getOutputStream();
        int length = 0;
        byte[] bytes = new byte[1024];
        while ((length = fis.read(bytes)) != -1) {
            outputStream.write(bytes, 0, length);
            outputStream.flush();
        }
//        关闭两个流
        fis.close();
        outputStream.close();
//        设置这个文件的文件类型
        response.setContentType("image/jpeg");
    }

    @Override
    public boolean delFile(String fileName) {
        Boolean flag;
        File file = new File(filePath + fileName);
        if (file.isFile()) {
            flag = deleteFile(file);
        } else {
            flag = deleteDirectory(file);
        }
        return flag;
    }

    /**
     * 删除文件夹
     */
    private Boolean deleteDirectory(File file) {

        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if ((!file.exists()) || (!file.isDirectory())) {
            System.out.println("删除目录失败：" + file + "不存在！");
            return false;
        }
        boolean flag = true;
        // 删除文件夹中的所有文件包括子目录
        File[] files = file.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {

                flag = deleteFile(new File(files[i].getAbsolutePath()));
                if (!flag)
                    break;
            }
            // 删除子目录
            else if (files[i].isDirectory()) {
                flag = deleteDirectory(new File(files[i].getAbsolutePath()));
                if (!flag)
                    break;
            }
        }
        if (!flag) {
            System.out.println("删除目录失败！");
            return false;
        }
        // 删除当前目录
        if (file.delete()) {
            System.out.println("删除目录" + file + "成功！");
            return true;
        } else {
            return false;
        }
    }

    /**
     * 删除文件
     */
    private Boolean deleteFile(File file) {
        return file.delete();
    }
}
